package com.wolfking.converter.web;

import com.google.common.collect.Maps;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.wolfking.converter.entity.ConverterPage;
import com.wolfking.converter.util.JsonConverterUtil;
import com.wolfking.spi.SpiInterface;

import java.util.Map;

@SpiInterface(defaultCode = "defaultResponseConverter")
public interface WebResponseConverter {

    Object convertOne(JsonObject jsonObject);

    Object convertList(JsonArray jsonArray);

    Object convertException(Exception e) throws Exception;

    default Object convertPage(ConverterPage page) {
        Map<String, Object> pageMap = Maps.newTreeMap();
        long pageCount = page.getCount() / page.getPageSize() + (page.getCount() % page.getPageSize() == 0 ? 0 : 1);
        int pageNum = page.getPageNum();
        int pageSize = page.getPageSize();
        int count = page.getCount();
        pageMap.put("prePage", Math.max(pageNum - 1, 1));
        pageMap.put("pageNum", pageNum);
        pageMap.put("pageSize", pageSize);
        pageMap.put("total", count);
        pageMap.put("pages", pageCount);
        pageMap.put("isLastPage", pageNum == pageCount);
        pageMap.put("isFirstPage", pageNum == 1);
        pageMap.put("hasPreviousPage", pageNum != 1);
        pageMap.put("hasNextPage", pageNum < pageCount);
        pageMap.put("previousPage", pageNum > 1 ? pageNum - 1 : 1);
        pageMap.put("nextPage", pageNum < pageCount ? pageNum + 1 : pageCount);
        pageMap.put("data", JsonConverterUtil.toListMap(page.getArray()));
        return pageMap;
    }
}
